Synchronized Data Structures (সিঙ্ক্রোনাইজড ডাটা স্ট্রাকচার) এমন ডাটা স্ট্রাকচার যা একাধিক থ্রেডের মধ্যে একযোগে নিরাপদভাবে কাজ করার জন্য ব্যবহৃত হয়। থ্রেড নিরাপত্তা নিশ্চিত করার জন্য সিঙ্ক্রোনাইজড ডাটা স্ট্রাকচারগুলি খুবই গুরুত্বপূর্ণ, বিশেষত মাল্টি-থ্রেডিং অ্যাপ্লিকেশন তৈরি করার সময়।
জাভা অনেক বিল্ট-ইন সিঙ্ক্রোনাইজড ডাটা স্ট্রাকচার সরবরাহ করে, যেমন Vector, Hashtable, এবং Concurrent Collections। এই ডাটা স্ট্রাকচারগুলি একাধিক থ্রেড দ্বারা অ্যাক্সেস করা হলে তাদের মধ্যে কোন ধরণের ডেটা ইন্টিগ্রিটি সমস্যা না হয়, সেই জন্য এগুলোর মধ্যে সিঙ্ক্রোনাইজেশন ব্যবহৃত হয়।
১. Synchronized Collections in Java
Vector (সিঙ্ক্রোনাইজড ArrayList)
Vector হলো একটি সিঙ্ক্রোনাইজড ডাইনামিক অ্যারে যা মাল্টি-থ্রেড অ্যাক্সেসের জন্য নিরাপদ। এটি ArrayList এর মতোই, তবে এর সমস্ত অপারেশন সিঙ্ক্রোনাইজড।
উদাহরণ: Vector
import java.util.*;
public class SynchronizedVector {
public static void main(String[] args) {
// Synchronized Vector
Vector<Integer> vector = new Vector<>();
// Multiple threads adding elements to vector
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
vector.add(i);
System.out.println("Thread 1 added: " + i);
}
});
Thread thread2 = new Thread(() -> {
for (int i = 10; i < 20; i++) {
vector.add(i);
System.out.println("Thread 2 added: " + i);
}
});
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// Print the vector contents
System.out.println("Vector Contents: " + vector);
}
}
ব্যাখ্যা:
- Vector ক্লাস একটি সিঙ্ক্রোনাইজড ডাটা স্ট্রাকচার। যখন একাধিক থ্রেড একই সময়ে
vector.add()মেথড কল করে, তখন সিঙ্ক্রোনাইজেশন নিশ্চিত করে যে শুধুমাত্র একটি থ্রেড একসাথেadd()মেথড কার্যকর করবে, যাতে ডেটা ক্ষতিগ্রস্ত না হয়।
আউটপুট:
Thread 1 added: 0
Thread 2 added: 10
Thread 1 added: 1
Thread 2 added: 11
...
Vector Contents: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
২. Hashtable (Synchronized HashMap)
Hashtable হল একটি সিঙ্ক্রোনাইজড key-value স্টোর যা HashMap এর মতো কাজ করে, তবে এটি মাল্টি-থ্রেড নিরাপত্তা নিশ্চিত করে। এতে সিঙ্ক্রোনাইজড মেথডগুলি অন্তর্ভুক্ত থাকে যাতে একাধিক থ্রেড একই সময়ে সিস্টেমের ডেটা অ্যাক্সেস করতে না পারে।
উদাহরণ: Hashtable
import java.util.*;
public class SynchronizedHashtable {
public static void main(String[] args) {
// Synchronized Hashtable
Hashtable<String, Integer> hashtable = new Hashtable<>();
// Multiple threads adding elements to hashtable
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
hashtable.put("Thread1-" + i, i);
System.out.println("Thread1 put: Thread1-" + i);
}
});
Thread thread2 = new Thread(() -> {
for (int i = 5; i < 10; i++) {
hashtable.put("Thread2-" + i, i);
System.out.println("Thread2 put: Thread2-" + i);
}
});
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// Print the hashtable contents
System.out.println("Hashtable Contents: " + hashtable);
}
}
ব্যাখ্যা:
- Hashtable সিঙ্ক্রোনাইজড ডাটা স্ট্রাকচার হিসেবে কাজ করে, যার ফলে মাল্টি-থ্রেডের মধ্যে একই
putঅপারেশন একসাথে কাজ না করে। Hashtable.put()মেথড সিঙ্ক্রোনাইজড, তাই একাধিক থ্রেড একই সময়ে মান সংযুক্ত করতে পারবে না।
আউটপুট:
Thread1 put: Thread1-0
Thread2 put: Thread2-5
Thread1 put: Thread1-1
Thread2 put: Thread2-6
...
Hashtable Contents: {Thread1-0=0, Thread1-1=1, Thread1-2=2, ..., Thread2-9=9}
৩. Concurrent Collections in Java
Java 5 থেকে Concurrent Collections সংযোজিত হয়েছে, যা মাল্টি-থ্রেডিং পরিবেশে পারফরম্যান্স বাড়ানোর জন্য ডিজাইন করা হয়েছে। এগুলোর মধ্যে ConcurrentHashMap এবং CopyOnWriteArrayList প্রধান।
ConcurrentHashMap:
এটি একটি Thread-safe ম্যাপ, তবে এতে ভিন্নভাবে সিঙ্ক্রোনাইজেশন প্রয়োগ করা হয়েছে। এটি মডিফিকেশনগুলির জন্য উপযুক্ত, এবং এটি একাধিক থ্রেডকে একই সময়ে একাধিক সেগমেন্টে কাজ করার অনুমতি দেয়।
উদাহরণ: ConcurrentHashMap
import java.util.concurrent.*;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
// ConcurrentHashMap ব্যবহার করা
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
// Multiple threads adding elements to ConcurrentHashMap
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
map.put("Thread1-" + i, i);
System.out.println("Thread1 added: Thread1-" + i);
}
});
Thread thread2 = new Thread(() -> {
for (int i = 5; i < 10; i++) {
map.put("Thread2-" + i, i);
System.out.println("Thread2 added: Thread2-" + i);
}
});
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// Print the ConcurrentHashMap contents
System.out.println("ConcurrentHashMap Contents: " + map);
}
}
ব্যাখ্যা:
- ConcurrentHashMap একই সময়ে অনেক থ্রেডের কাছে নিরাপদভাবে ডেটা অ্যাক্সেস করার সুযোগ দেয়, তবে এটি একটি সেগমেন্ট-ভিত্তিক সিঙ্ক্রোনাইজেশন কৌশল ব্যবহার করে যা পারফরম্যান্স উন্নত করে।
আউটপুট:
Thread1 added: Thread1-0
Thread2 added: Thread2-5
Thread1 added: Thread1-1
Thread2 added: Thread2-6
...
ConcurrentHashMap Contents: {Thread1-0=0, Thread1-1=1, ..., Thread2-9=9}
সারাংশ
Synchronized Data Structures মাল্টি-থ্রেডিং পরিস্থিতিতে ডেটা নিরাপত্তা নিশ্চিত করতে ব্যবহৃত হয়। Java তে সিঙ্ক্রোনাইজড ডাটা স্ট্রাকচার ব্যবহৃত হয় বিশেষত একাধিক থ্রেড যখন একই ডেটাতে কাজ করে তখন, যাতে কোন ডেটা ক্ষতিগ্রস্ত না হয়।
গুরুত্বপূর্ণ পয়েন্টস:
- Vector এবং Hashtable সিঙ্ক্রোনাইজড ডাটা স্ট্রাকচার যা থ্রেড সেফ। এগুলির প্রতিটি অপারেশন সিঙ্ক্রোনাইজড, তাই একাধিক থ্রেড সেগুলিকে একসাথে অ্যাক্সেস করতে পারে না।
- Concurrent Collections (যেমন ConcurrentHashMap) মাল্টি-থ্রেড পরিবেশে ভালো পারফরম্যান্স নিশ্চিত করে এবং বিভিন্ন সেগমেন্টে একাধিক থ্রেডকে কাজ করতে দেয়।
- Synchronized Collections প্রধানত পুরানো জাভা সংস্করণের জন্য ব্যবহৃত হয়, তবে Concurrent Collections আধুনিক জাভা অ্যাপ্লিকেশনগুলির জন্য আরও ভালো পারফরম্যান্স প্রদান করে।
এসব ডাটা স্ট্রাকচার ও তাদের সিঙ্ক্রোনাইজেশন থ্রেড সেফ ডেটা ম্যানেজমেন্ট নিশ্চিত করে এবং একই সময়ে একাধিক থ্রেডকে ডেটা অ্যাক্সেস করতে সাহায্য করে।
Read more